package roles;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import model.Case;
import model.Fourmiliere;
import etresVivant.Fourmi;

public class Sexue extends Role {

	/**
	 * Quantite de pheromone deposee par une fourmi sexuee sur une case. 
	 */
	private final int PHEROMONE_REPRODUCTION = 10000;

	/**
	 * Creer un role correspondant a sexue.
	 */
	public Sexue() {
		minEsperanceVie = 1.5f * 360.0f;
		maxEsperanceVie = 2.5f * 360.0f;
		minPoids = 1.5f;
		maxPoids = 2.0f;
		bSexue = 1;
	}

	@Override
	public Object actions(Fourmiliere f, Fourmi fr) {
		deplacerSexue(fr);
		return null;
	}

	/**
	 * Depose une pheromone de reproduction sur la case de la fourmi sexuee
	 * si et seulement si cette fourmi est une femelle.
	 * @param une fourmi de type sexuee
	 */
	public void deposerPheromoneReproduction(Fourmi sexue) {
			sexue.getCase().setPheromoneReproduction(PHEROMONE_REPRODUCTION);
	}

	/**
	 * Deplace une fourmi sexue selon son sexe. On fait appel
	 * a une methode de deplacement specifique selon le sexe.
	 * @param une fourmi de type sexuee femelle
	 */
	public void deplacerSexue(Fourmi sexue) {
		switch (sexue.getSexe()) {
		case FEMELLE:
			deplacerSexueFemelle(sexue);
			break;
		case MALE:
			deplacerSexueMale(sexue);
			break;
		default:
			break;
		}

	}

	/**
	 * Deplace une fourmi sexuee de sexe male en suivant les pheromones
	 * de reproduction deposees par les femelles si elles existent. Sinon
	 * le male se deplace aleatoirement.
	 * @param une fourmi de type sexuee male
	 */
	private void deplacerSexueMale(Fourmi sexueMale) {
		ArrayList<Case> casesVoisines = new ArrayList<Case>();
		casesVoisines = sexueMale.getCase().casesVoisines();
		Map<Integer, Case> hashMap = new HashMap<Integer, Case>();
		int max = 0;
		for (Case c : casesVoisines) {
			hashMap.put(c.getPheromoneReproduction(), c);
			if (max < c.getPheromoneReproduction())
				max = c.getPheromoneReproduction();
		}
		if(max > 0) {
			sexueMale.setCase(hashMap.get((int)max));
		} else {
			Random rd = new Random();
			int num = rd.nextInt(casesVoisines.size());
			sexueMale.setCase(casesVoisines.get(num));
		}

	}

	/**
	 * Deplace une fourmi sexue de sexe femelle en faisant appel
	 * a la fonction de depot de pheromone de production.
	 * La pheromone de reproduction est deposee sur la nouvelle case.
	 * @param une fourmi de type sexuee femelle
	 */
	private void deplacerSexueFemelle(Fourmi sexueFemelle) {
		sexueFemelle.deplacer();
		this.deposerPheromoneReproduction(sexueFemelle);
	}

	@Override
	public String monRole() {
		return "Sexue";
	}
}
